"""
属性介绍
    概述：
        属性：名词   用于描述事物的外在特征的，比如 学生： 姓名，年龄，性别.......
    分类：
        根据编写位置的不同，主要分为：
            类属性
            对象属性

类属性介绍：
    概述：
        属于类的属性，即：能被该类下所有的对象所共享的变量，
        即：A对象修改了变量的值，B对象有直接的影响（访问的也是修改后的值）

    定义格式
        类内： 属性名 = 属性值  要写到类中，函数外部
    调用格式：
        类名.属性名
        对象名.属性名  # 可以这么写（不报错），但是不推荐
    细节：
        如果修改类变量的值， 只能通过 类名.属性名 = 属性值   的方式来改变
        如果是用  对象名.属性名 = 属性值  的方式来修改值， 不是修改类变量的值，而是给对象新增了一个对象属性（对象变量）


对象属性介绍
    概述：
        属于每个对象的变量，即A对象修改了它的属性值，对B对象没有任何的影响
    定义格式：
        类外：
            对象名.属性名  = 属性值
        类内：
            要定义在__init__() 魔法方法中
    调用格式：
        类外   对象名.属性名
        类内： self.属性名
"""

# 定义一个学生类
class Student:
    # 定义类属性
    teacher = '王志刚'

    # 在类内定义对象属性
    def __init__(self,name,age,gender,address):
        self.name = name
        self.age = age
        self.gender = gender
        self.address = address

    def speak(self):
        print(f'我叫{self.name},来自{self.address}') # 在类的内部访问对象属性

if __name__ == '__main__':
    # 创建学生对象
    s1 = Student(name='刘千琪',age=20,gender='女',address='吉林长春')
    s2 = Student(name='崔龙腾',age=20,gender='男',address='河北邯郸')

    # 在类外添加对象属性
    s1.height = 178
    s2.weight = 50

    # 在类外访问属性
    print(s1.name)
    print(s2.age)


    print('=' * 30)
    # 演示在类外访问  类属性
    print(Student.teacher)
    print(s1.teacher) # 对象名.  的方式访问，可以，但是不推荐
    print(s2.teacher) # 对象名.  的方式访问，可以，但是不推荐

    print('=' * 30)
    # 演示在修改类属性的值
    # Student.teacher = '张纪豪' # 类属性修改只能通过  类名. 的方式来修改

    # 如果是用  对象名.属性名 = 属性值  的方式来修改值，
    # 不是修改类变量的值，而是给对象新增了一个对象属性（对象变量）
    s1.teacher = '张纪豪'
    print(s2.teacher)


if __name__ == '__main__':
    pass